/**
 * interface 的使用 
 * 1 export interface Person{
 * name:string,
 * age?:number 代表的意思就是可有可无
 * } 
 * 使用 tom:Person={}
 * 2 interface Person{
 * }
 * */

/***
 * type 的使用 interface 和 type interface简单 type 复杂
 * export type Tom={
 * name:string,
 * age?:number
 * }
 * 
 */

/**
 * typeof 和 keyof 的区别和使用 
 * typeof 可以获取一个变量或者对象的类型\
 * eg type User={ name:string} let Tom:User={name:'899'}
 * type UserT = typeof Tom
 * let tm:UserT ={
 * name:'65464'
 * }
 * keyof 可以获取属性名称
 * interface Pa {
 * name:string
 * }
 * interface Pb = keyof Pa
 */

/**
 * 泛型和泛型约束 不知道是什么类型 通过外接传递进来
 * eg function getMsg<T>(msg:T):T{  return msg;} ==>  let msg = getMsg<string>('新增成功');
  每个字段意思
  <T> 表示泛型类型参数，可以在函数内部使用。
  getMsg 是函数名。
  (msg: T) 表示函数参数，参数名为 msg，类型为泛型类型参数 T。
  :T 表示函数返回值的类型，也是泛型类型参数 T。
  这个函数的作用是接收一个值，并将其返回。由于函数参数和返回值类型都是泛型类型参数 T，因此该函数可以接收任何类型的值，并返回相同类型的值。例如，
  如果调用 getMsg(42)，函数将返回数字 42；如果调用 getMsg("Hello, world!")，函数将返回字符串 "Hello, world!"。
 * 
 */

  /**
   * 
   * type Fas<T> = T extends {name: infer Test} ? Test : unknown; 这个是一个泛型函数
   * Fas<T>: 定义了一个泛型类型别名，其中 T 是一个类型参数。
      T extends {name: infer Test}: 使用了条件类型，它表示当 T 是一个包含 name 属性的类型时，将 name 属性的类型提取出来并赋值给 Test 类型变量。
      ? Test : unknown: 当 T 包含 name 属性时返回 Test 类型变量，否则返回 unknown 类型。
      因此，可以使用 Fas<T> 来获取类型 T 中的 name 属性的类型。如果 T 不包含 name 属性，则返回 unknown 类型。
   */

/**
 * 什么交叉类型 &
 * 基本类型 同一个参数 只能存在一个类型 type t1 = string & number; 错误展示
 * interface Iname{
    name:string
    }
    interface Iage{
    age:number
    }
    type users = Iname & Iage;
 * 
 * 
 */

/**
 * 联合类型
 * //联合类型 : 取值是多种类型中的一种
 * add(parm1:string | number,parm2:string | number)
 */

/**
 * Omit 
 * Omit<K,T> : 用于从指定类型中，排除指定的属性，返回一个新的类型
    K：是对象类型名称，T：是剔除K类型中的属性名称
    type OmitUser = {
            name:string;
            age:number;
            sex:string;
    }
    type NewOmitUser = Omit<OmitUser,'sex'>
    //等价于
    type OmitUser1 = {
          name:string;
          age:number;
    }
 */

/**
 * Pick : 从一个类型中，取出几个想要的属性
 * interface ITest{
    type:string,
    text:string
    }
    type TTest = Pick<ITest,'text'>;
 */